package com.asiainfo.indb.view;

import com.asiainfo.indb.model.FileGather;
import com.asiainfo.indb.model.InDbGather;

import javax.swing.*;
import java.awt.*;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 主窗口
 *
 * @author zym
 */
public class InDb extends JFrame implements InDbPanel {

    /**
     * 存储当前窗口所有面板信息
     */
    private Map<Class<? extends InDbPanel>, InDbPanel> panelMap = new ConcurrentHashMap<>();

    public InDb() {
        init();
    }

    /**
     * 初始化窗口
     */
    private void init() {
        // 基本信息
        initBaseInfo();

        // 定位
        initLocation();

        // 渲染界面
        render();

        // 显示窗体
        setVisible(true);
    }

    private void initBaseInfo() {
        setTitle(InDbConfig.TITLE);
        setSize(InDbConfig.WIDTH, InDbConfig.HEIGHT);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);
    }

    /**
     * 定位：居中定位必须先指定框体的宽和高
     */
    private void initLocation() {
        Point center = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
        setLocation(center.x - getWidth() / 2, center.y - getHeight() / 2);
    }

    /**
     * 渲染界面
     */
    @Override
    public void render() {
        Container container = getContentPane();
        container.setLayout(new FlowLayout());

        // 文件面板
        container.add(new FilePanel(this));
        // 控制面板
        container.add(new ControlPanel(this));
        // 数据库面板
        container.add(new DbPanel(this));
        // 表面板
        container.add(new TablePanel(this));
        // 提交按钮
        container.add(new SubmitPanel(this));

        // 重新计算高度并定位
        if (panelMap.size() > 0) {
            final AtomicInteger heightCounter = new AtomicInteger();
            panelMap.values().forEach(panel -> {
                if (panel instanceof JPanel) {
                    JPanel jPanel = (JPanel) panel;
                    heightCounter.addAndGet(jPanel.getPreferredSize().height);
                }
            });

            setSize(new Dimension(getWidth(), heightCounter.get() + 50));
            initLocation();
        }

        // 设置初始值
        initData();
    }

    private void initData() {
        initByFile(new FileGather("init.properties"));
    }

    @Override
    public InDbPanel getParentPanel() {
        return null;
    }

    /**
     * 本身就是顶级容器了
     *
     * @return 容器
     */
    @Override
    public Container getTopContainer() {
        return this;
    }

    @Override
    public void initByFile(final FileGather gather) {
        if (panelMap.size() > 0) {
            panelMap.values().forEach(panel -> panel.initByFile(gather));
        }
    }

    @Override
    public void cachePanel(InDbPanel inDbPanel) {
        panelMap.putIfAbsent(inDbPanel.getClass(), inDbPanel);
    }

    @Override
    @SuppressWarnings("all")
    public <T extends InDbPanel> T getCachedPanel(Class<T> panelCls) {
        return (T) panelMap.get(panelCls);
    }

    @Override
    public InDbGather gather() {
        return null;
    }
}